#!/usr/bin/env python3
"""
CPU温度USB实时推送器
通过USB串口周期性发送CPU温度到外部设备
"""

import psutil
import serial
import time
import argparse
import sys
from datetime import datetime

def get_cpu_temperature():
    """获取CPU温度（摄氏度）"""
    try:
        # 尝试多种方式获取CPU温度
        temps = psutil.sensors_temperatures()
        
        # 查找CPU温度传感器
        cpu_temp = None
        for name, entries in temps.items():
            if 'cpu' in name.lower() or 'core' in name.lower():
                if entries:
                    cpu_temp = entries[0].current
                    break
        
        # 如果没有找到，尝试使用第一个可用的温度传感器
        if cpu_temp is None and temps:
            for name, entries in temps.items():
                if entries:
                    cpu_temp = entries[0].current
                    break
        
        return cpu_temp
    
    except Exception as e:
        print(f"获取CPU温度失败: {e}")
        return None

def send_temperature(serial_port, baud_rate=9600, interval=2):
    """通过串口发送CPU温度"""
    try:
        # 打开串口
        with serial.Serial(serial_port, baud_rate, timeout=1) as ser:
            print(f"已连接到串口 {serial_port} (波特率: {baud_rate})")
            print("开始发送CPU温度数据，按 Ctrl+C 停止...\n")
            
            while True:
                temp = get_cpu_temperature()
                if temp is not None:
                    # 格式化温度数据
                    temp_str = f"CPU:{temp:.1f}°C\n"
                    
                    # 发送到串口
                    ser.write(temp_str.encode('utf-8'))
                    
                    # 打印到控制台
                    timestamp = datetime.now().strftime("%H:%M:%S")
                    print(f"[{timestamp}] 发送: {temp_str.strip()}")
                else:
                    print("无法获取CPU温度，跳过此次发送")
                
                # 等待指定间隔
                time.sleep(interval)
                
    except serial.SerialException as e:
        print(f"串口错误: {e}")
        return False
    except KeyboardInterrupt:
        print("\n\n程序已停止")
        return True
    except Exception as e:
        print(f"发生错误: {e}")
        return False

def list_available_ports():
    """列出所有可用的串口"""
    import serial.tools.list_ports
    
    ports = list(serial.tools.list_ports.comports())
    if not ports:
        print("未找到可用的串口")
        return
    
    print("可用的串口:")
    for port in ports:
        print(f"  {port.device} - {port.description}")

def main():
    """主函数"""
    parser = argparse.ArgumentParser(description='CPU温度USB实时推送器')
    parser.add_argument('port', nargs='?', help='串口号 (如 COM3 或 /dev/ttyUSB0)')
    parser.add_argument('-b', '--baud', type=int, default=9600, help='波特率 (默认: 9600)')
    parser.add_argument('-i', '--interval', type=float, default=2.0, help='发送间隔(秒) (默认: 2.0)')
    parser.add_argument('-l', '--list', action='store_true', help='列出可用串口')
    
    args = parser.parse_args()
    
    # 列出可用串口
    if args.list:
        list_available_ports()
        return
    
    # 检查是否提供了串口号
    if not args.port:
        print("错误: 必须指定串口号")
        print("使用 -l 或 --list 查看可用串口")
        print("示例: python cpu_temp_sender.py COM3")
        return
    
    # 开始发送温度
    success = send_temperature(args.port, args.baud, args.interval)
    
    if not success:
        sys.exit(1)

if __name__ == "__main__":
    main()
